//栈溢出和堆溢出实现代码

import java.util.ArrayList;
import java.util.List;

public class overFlow {
    public static void main(String[] args) {
        overFlow o = new overFlow();
        o.testHeap();
        o.testStack();
    }

    //堆溢出
    //java.lang.OutOfMemoryError: Java heap space
    //堆是程序员自己控制的内存空间，给每一个对象（实例）分配空间，数组也放在堆里
    //当实体不再被指向时由JVM的垃圾回收机制清除，C++则需要程序员自己释放
    public void testHeap(){
        List<byte[]> list = new ArrayList<>();
        int i = 0;
        while(true){
            //如果创建对象时没有可以分配的堆内存，则会堆溢出
            //会有new在代码里出现
            list.add(new byte[5 * 1024 * 1024]);
            System.out.println("count is " + (++i));
        }
    }

    int num = 1;
    //栈溢出
    //java.lang.StackOverflowError
    //栈是用来存储基本数据类型和局部变量的位置，由编译器控制
    //例如递归时，如果不断地递归，就会留下痕迹
    //在执行完毕后会立即释放
    public void testStack(){
        num++;
        this.testStack();
    }
}
